#include <bits/stdc++.h>

using namespace std;

// 会议只占一天的最大会议数量
// 给定若干会议的开始、结束时间
// 任何会议的召开期间，你只需要抽出1天来参加
// 但是你安排的那一天，只能参加这个会议，不能同时参加其他会议
// 返回你能参加的最大会议数量
// 测试链接 : https://leetcode.cn/problems/maximum-number-of-events-that-can-be-attended/

class Solution 
{
public:
    int maxEvents(vector<vector<int>>& events) 
    {
        int n = events.size();
        sort(events.begin(), events.end(), [](auto& a, auto& b){
            return a[0] < b[0]; // 根据会议的开始时间进行排序
        });
        // 求出会议最早开始时间和最晚结束时间
        int mn = events[0][0], mx = events[0][1];
        for(int i = 1; i < n; ++i) mx = max(mx, events[i][1]);
        // 小根堆 : 维护会议的结束时间
        priority_queue<int, vector<int>, greater<int>> heap;
        int i = 0, ans = 0;
        for(int day = mn; day <= mx; ++day)
        {
            while(i < n && events[i][0] == day)
            {
                heap.push(events[i++][1]);
            }
            // 去掉过期的会议
            while(!heap.empty() && heap.top() < day)
            {
                heap.pop();
            }
            // 这一天就参加这个会议
            if(!heap.empty())
            {
                heap.pop();
                ++ans;
            }
        }
        return ans;
    }
};